#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPixmap>
#include <QMessageBox>
#include <QNetworkInterface>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    // 设置UI界面
    ui->setupUi(this);

    // 创建UDP Socket对象
    udpSocket = new QUdpSocket(this);

    // 设置目标IP和端口
    peerPort = 8888;
    peerAddr = "192.168.51.89";

    // 当有数据可读时，调用processPendingDatagrams处理
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
    // 录制按钮点击时，调用videoSlot开始视频流
    connect(ui->send, SIGNAL(clicked()), this, SLOT(videoSlot()));
    // 暂停按钮点击时，调用stopSlot停止视频流
    connect(ui->stop, SIGNAL(clicked()), this, SLOT(stopSlot()));
    // 截图按钮点击时，调用photoSlot保存当前帧
    connect(ui->snip, SIGNAL(clicked()), this, SLOT(photoSlot()));

    // 创建并设置定时器
    tim = new QTimer(this);  // 创建定时器对象
    tim->setInterval(10);  // 设置定时器间隔为30毫秒
    // 定时器超时时，调用onTimeoutSlot发送请求
    connect(tim, SIGNAL(timeout()), this, SLOT(onTimeoutSlot()));
}

// 析构函数：清理资源
Widget::~Widget()
{
    delete ui;  // 删除UI对象
    delete udpSocket;  // 删除UDP Socket对象
    delete tim;  // 删除定时器对象
}

void Widget::processPendingDatagrams()
{
    while(udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagram.data(), datagram.size(), &peerAddr, &peerPort);

        if(image.loadFromData(datagram, "JPEG")) {
            // 水平镜像翻转
            QImage mirroredImage = image.mirrored(true, false);  // 水平翻转，垂直不翻转
            ui->video->setPixmap(QPixmap::fromImage(mirroredImage));
            ui->video->show();
            currentImage = mirroredImage;  // 保存翻转后的图像用于截图
        } else {
            qDebug() << "Failed to load image from data";
        }
    }
}

// 开始视频流
void Widget::videoSlot()
{
    qDebug() << "Attempting to start video stream...";

    // 发送获取视频流的请求
    udpSocket->writeDatagram("get_stream", peerAddr, peerPort);

    // 启动定时器，周期性发送请求
    tim->start();
    if(udpSocket->state() != QAbstractSocket::BoundState) {
        qDebug() << "Socket not bound! State:" << udpSocket->state();
    }
}

// 停止视频流
void Widget::stopSlot()
{
    // 输出调试信息
    qDebug() << "stop";

    // 停止定时器
    tim->stop();
}

// 截图功能
void Widget::photoSlot()
{
    // 暂停定时器（暂停视频流）
    tim->stop();

    // 在UI上显示当前图像
    ui->video->setPixmap(QPixmap::fromImage(currentImage));
    ui->video->show();

    // 获取当前时间并格式化为字符串
    QDateTime date = QDateTime::currentDateTime();
    QString timeString = date.toString("yyyy_MM_dd_hh_mm_ss");

    // 构建保存路径（使用时间戳作为文件名）
    QString save = timeString + ".png";
    qDebug() << save;  // 输出保存路径

    // 保存图像到文件
    currentImage.save(save);

    // 重新启动定时器
    tim->start();
}

// 定时器超时处理函数
void Widget::onTimeoutSlot()
{
    // 发送获取视频流的请求
    udpSocket->writeDatagram("get_stream", peerAddr, peerPort);
}
